#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

pid_t childpid;
int flag = 0;
int count, recieved_count = 0;

void sigusr1(int signal) {
	recieved_count++;
	//printf("Parent: otrzymałem %d powrotny SIGUSR1\n", recieved_count);
	if (recieved_count < count) {
		kill(childpid, SIGUSR1);
	} else if (count == recieved_count) {
		kill(childpid, SIGUSR2);
	}
}

void sigusr2(int signal) {
	printf("Potomek przysłał %d sygnałów, powinien: %d\n", recieved_count, count);
	int s;
	wait(&s);
	flag = 1;
}


int main(int argc, char ** argv) {
	if (argc != 2) {
		printf("Niepoprawna liczba argumentów. Poprawne wywołanie: ./sender <liczba>\n");
		return -1;
	}
	count = atoi(argv[1]);
	if (count <=0) {
		printf("Argument musi być liczbą całkowitą dodatnią\n");
		return -2;
	}
	if (signal(SIGUSR1, sigusr1) == SIG_ERR) {
		perror("signalUSR1");
		return -3;
	}
	if (signal(SIGUSR2, sigusr2) == SIG_ERR) {
		perror("signalUSR2");
		return -4;
	}
	pid_t pid = fork();
	if (pid < 0) {
		perror("fork");
		return -5;
	} else if (pid == 0) {
		childpid = getpid();
		_exit(execl("./reciever.o", "reciever.o", NULL));
	} else {
		sleep(1);
		if (kill(childpid, SIGUSR1) < 0) {
			perror("kill");
			return -6;
		}
		while(flag != 1);
	}
	return 0;
}
